// ----------- 使用方式
function* read1() {
    const a = yield 1;
    const b = yield 2;
    const c = yield 3;
}
let it = read1()
console.log([...it]) // [1,2,3]
console.dir(it.next, { showHidden: true }) // 打印隐藏属性 { value:'xxx', done:false}
console.log(Array.from({ 0: 1, 1: 2, 2: 3, length: 3 })) // [1,2,3]
// console.log([...{ 0: 1, 1: 2, 2: 3, length: 3 }]) // error is not iterator

/***元编程 */
console.log({ a: '1' }.toString()) // [ object Object]
console.log({
    a: '1',
    get [Symbol.toStringTag]() {
        return '元编程'
    }
}.toString()) // [ object 元编程]

console.log([...{
    0: 1, 1: 2, 2: 3, length: 3, [Symbol.iterator]: function* () {
        yield 2
        yield 3
        yield 4
    }
}]) // [2,3,4]  ... 内部使用迭代器  依赖 iterator

console.log([...{
    0: 1,
    1: 2,
    2: 3,
    length: 3,
    // [Symbol.iterator]: function () {  // [1,2,3]  自定义返回写法
    //     let arr = this
    //     let index = 0
    //     return {
    //         next() {
    //             return {
    //                 value: arr[index],
    //                 done: index++ === arr.length
    //             }
    //         }
    //     }
    // }
    [Symbol.iterator]: function* () {  // [1,2,3]  generator写法
        let arr = this
        let index = 0
        while (index < this.length) {
            yield arr[index++]
        }
    }
}])

/**
 * generator方法执行后返回一个iterator， 
 * iterator 可以调用next方法进行迭代 next方法返回一个 { value:'xxx', done:false}
 * 代码块中遇见yield时停止 调用next方法时 将参数当做上一个yield的返回值
*/

